/**
 * 通用js方法封装处理
 * Copyright (c) 2019 common
 */
export function go_back(){
  this.$router.go(-1);
}

//节流函数
var timer;
export function throttle(fn,wait){
  clearTimeout(timer);
  timer=setTimeout(function(){
    fn();
  },wait);
}
//强制更换导航选中显示
export function nav_change_show(top_url,left_url,num){
  var this_obj=this;
  if(num){
    for(var i=0;i<num;i++){
      this_obj=this_obj.$parent;
    }
  }else{
    this_obj=this.$parent.$parent;
  }
  if(top_url){
    //强制切换顶部菜单
    this_obj.$refs.navbar.$refs.topNav.activeMenuFinal=top_url
    //关联左侧导航
    this_obj.$refs.navbar.$refs.topNav.activeRoutes(top_url)
  }
  if(left_url){
    //选中左侧导航
    this_obj.$refs.sidebar.activeMenuFinal=left_url
  }

}
// 加载层
export function LoadingShowHide(bl){
  this.$Loading.LoadingShowHide(bl);
}
//消息提醒
export function tips_show(str){
  this.$Tips.Tipshow(str);
}
export function input_lengt_(e,length_){//最多输入xx字;
  var this_box=e.currentTarget;
  var cur_text=this_box.value;
	if(cur_text.length>length_){
		this_box.value=cur_text.slice(0, length_);
		this_box.dispatchEvent(new Event('input'));//解决改变value值以后v-model不更新的问题
		this.$Tips.Tipshow('最多输入'+length_+'字');
	}
}
// 金额保留两位小数
export function amount_count(num,type){
  num=num+'';
  if(type=='01'){//需要可输入负数
      num = num.replace(/[^\d+.-]/g, ""); //清除"数字"、"."、"+"、"-"号以外的字符
  }else{//只要正数
      num = num.replace(/[^\d.]/g, ""); //清除"数字"、"."号以外的字符
  }
  num = num.replace(/^\./g, ""); //验证第一个字符是.字
  //num = num.replace(/^[0]/g, "");//验证第一个字符是0字
  // num = num.replace(/00/g, "0"); //验证第一个是多个0（只保留第一个0, 清除多余的0）
  num = num.replace(/\.{2,}/g, "."); //只保留第一个".", 清除多余的
  num = num.replace(/\-{2,}/g, "-"); //只保留第一个"-", 清除多余的
  num = num.replace(/\+{2,}/g, "+"); //只保留第一个"+", 清除多余的
  num = num.replace(/\+\-/g, "+"); //只保留第一个"+", 清除多余的"-"
  num = num.replace(/\-\+/g, "-"); //只保留第一个"-", 清除多余的"+"
  num = num.replace(/[0-9]+\+/g, ""); //数字后面不准许输入"+"
  num = num.replace(/[0-9]+\-/g, ""); //数字后面不准许输入"-"
  num = num.replace(/\.[0-9]*\+/g, "."); //去除"."号后面的"+"
  num = num.replace(/\.[0-9]*\-/g, "."); //去除"."号后面的"-"
  num = num.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  num = num.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
  if (num.indexOf(".") < 0 && num != "" && num != "-" && num != "-0") {//以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
    num = parseFloat(num);
  }
  return num;
}

export function addMonth(d, m) { //根据时间添加月份
  var ds = d.split('-'),
    _d = ds[2] - 0;
  var nextM = new Date(ds[0], ds[1] - 1 + m + 1);
  var max = nextM.getDate();
  d = new Date(ds[0], ds[1] - 1 + m);
  var year = d.getFullYear();
  var month = d.getMonth() + 1;
  if (month < 10) {
    var month = '0' + month
  }
  return year + "-" + month + '-01';
}
// 当前浏览器判断
export function getBrowser() {
  // 获取浏览器 userAgent
  var ua = navigator.userAgent;
  // 是否为 Opera
  var isOpera = ua.indexOf('opr') > -1
  // 返回结果
  if (isOpera) {
    return 'Opera'
  }

  // 是否为 IE
  var isIE = (ua.indexOf('compatible') > -1) && (ua.indexOf('MSIE') > -1) && !isOpera
  var isIE11 = (ua.indexOf('Trident') > -1) && (ua.indexOf("rv:11.0") > -1)
  // 返回结果
  if (isIE11) {
    return 'IE11'
  } else if (isIE) {
    // 检测是否匹配
    var re = new RegExp('MSIE (\\d+\\.\\d+);')
    re.test(ua)
    // 获取版本
    var ver = parseFloat(RegExp["$1"])
    // 返回结果
    if (ver == 7) {
      return 'IE7'
    } else if (ver == 8) {
      return 'IE8'
    } else if (ver == 9) {
      return 'IE9'
    } else if (ver == 10) {
      return 'IE10'
    } else {
      return "IE"
    }
  }

  //console.log(ua);
  // 是否为 Edge
  var isEdge = ua.indexOf("Edg") > -1
  // 返回结果
  if (isEdge) {
    return 'Edge'
  }

  // 是否为 Firefox
  var isFirefox = ua.indexOf("Firefox") > -1
  // 返回结果
  if (isFirefox) {
    return 'Firefox'
  }

  // 是否为 Safari
  var isSafari = (ua.indexOf("Safari") > -1) && (ua.indexOf("Chrome") == -1)
  // 返回结果
  if (isSafari) {
    return "Safari"
  }

  // 是否为 QQ
  var isQQ = ua.indexOf("QQBrowser") > -1
  // 返回结果
  if (isQQ) {
    return 'QQ'
  }
  // 是否为搜狗浏览器
  var isMaxthon = ua.indexOf("se 2.x") > -1 || ua.indexOf("SE 2.X") > -1;
  // 返回结果
  if (isMaxthon) {
    return 'sougou'
  }

  // 是否为2345浏览器
  var is2345Explorer = ua.includes("2345Explorer") > -1;
  // 返回结果
  if (is2345Explorer) {
    return '2345';
  }

  // 是否为 Chrome
  var isChrome = (ua.indexOf("Chrome") > -1) && (ua.indexOf("Safari") > -1) && (ua.indexOf("Edge") == -1) && (ua
    .indexOf("QQBrowser") == -1) && (ua.indexOf("2345Explorer") == -1);
  // 返回结果
  if (isChrome) {
    return 'Chrome'
  }


  // 都不是
  return ''
}
//将base64码转换为Blob
export function dataURLToBlob(dataurl) {
  var arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime
  });
}
export function getCookie(cname) { //获取cookie
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i].trim();
    if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  }
  return "";
}
export function setCookie(name, value) {
  var url = window.location.href;
  if (url.indexOf("008box.com") > -1) {
    var domain_url = "008box.com";
  } else if (url.indexOf("localhost") > -1) {
    var domain_url = '';
  } else {
    var domain_url = "we17.com";
  }
  var str = name + "=" + escape(value) + ";domain=" + domain_url + ";path=/";
  var date = new Date();
  date.setTime(date.getTime() + 1 * 24 * 60 * 60 * 1000); //设置date
  str += ";expires=" + date.toGMTString();
  document.cookie = str;
}
export function num_show(_num) { //取两位小数
  var num = Math.round(_num * 100) / 100;
  return Number(num);
}
// 数字保留两位小数展示
export function money_thousand(num) {
  if (!num) {
    return '0.00';
  }
  num = num.toString().split("."); // 分隔小数点
  var arr = num[0].split("").reverse(); // 转换成字符数组并且倒序排列
  var res = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    if (i % 3 === 0 && i !== 0) {
      res.push(","); // 添加分隔符
    }
    res.push(arr[i]);
  }
  res.reverse(); // 再次倒序成为正确的顺序
  if (num[1]) { // 如果有小数的话添加小数部分
    if (num[1].length == 1) {
      res = res.join("").concat("." + num[1]) + '0';
    } else {
      if (num[1].length > 2) {
        res = res.join("").concat("." + num[1].substr(0, 2));
        // console.log(res);
      } else {
        res = res.join("").concat("." + num[1]);
      }
    }
  } else {
    res = res.join("") + '.00';
  }
  return res;
}
// 精准运算
//精确运算 加
export function accAdd(addendOne, addendTwo) { //数字相加
  var addendOneLength, addendTwoLength, maxValue, absValue;
  try {
    addendOneLength = addendOne.toString().split(".")[1].length;
  } catch (e) {
    addendOneLength = 0;
  }
  try {
    addendTwoLength = addendTwo.toString().split(".")[1].length;
  } catch (e) {
    addendTwoLength = 0;
  }
  // 判断绝对值的结果，
  absValue = Math.abs(addendOneLength - addendTwoLength);
  maxValue = Math.pow(10, Math.max(addendOneLength, addendTwoLength));

  if (absValue > 0) {
    var power = Math.pow(10, absValue);
    if (addendOneLength > addendTwoLength) {
      addendOne = Number(addendOne.toString().replace(".", ""));
      addendTwo = Number(addendTwo.toString().replace(".", "")) * power;
    } else {
      addendOne = Number(addendOne.toString().replace(".", "")) * power;
      addendTwo = Number(addendTwo.toString().replace(".", ""));
    }
  } else {
    addendOne = Number(addendOne.toString().replace(".", ""));
    addendTwo = Number(addendTwo.toString().replace(".", ""));
  }
  return (addendOne + addendTwo) / maxValue;
}


//精确运算 减乘
export function accSub(a, b) {
  var c, d, e;
  try {
    c = a.toString().split(".")[1].length;
  } catch (f) {
    c = 0;
  }
  try {
    d = b.toString().split(".")[1].length;
  } catch (f) {
    d = 0;
  }
  return e = Math.pow(10, Math.max(c, d)), (accMul(a, e) - accMul(b, e)) / e;
}

//精确运算 乘
export function accMul(a, b) {
  var c = 0,
    d = a.toString(),
    e = b.toString();
  try {
    c += d.split(".")[1].length;
  } catch (f) {}
  try {
    c += e.split(".")[1].length;
  } catch (f) {}
  return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}

export function accDiv(arg1,arg2){
  var r1=0,r2=0,m,s1=arg1.toString(),s2=arg2.toString();
  try{
    if(s1.split(".")[1] != undefined )
    r1=s1.split(".")[1].length;
  }catch(e){}
  try{
    if(s2.split(".")[1] != undefined )
    r2=s2.split(".")[1].length;
  }catch(e){}
  m=Math.pow(10,Math.max(r1,r2));
  return (accMul(arg1,m))/(accMul(arg2,m));
}

// 点击body
export function all_hide() {
  // console.log('点击body')
  document.body.click()
}

//(工厂价)聚焦全选
export function getInputFocus(event) {
  event.currentTarget.select();
}

//相同属性对象去重
export function objHeavy(arr) {
  let arr1 = []; //存id
  let newArr = []; //存新数组
  for (let i in arr) {
    if (arr1.indexOf(arr[i].id) === -1) {
      arr1.push(arr[i].id);
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
//生成文件名称
export function get_file_name(img_type) {
  var date = new Date();
  var this_name = date.getFullYear() +
    ((date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1)) +
    (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) +
    (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) +
    (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) +
    (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()) +
    '_' + rand('0000', '9999') + '.' + img_type;
  return this_name;
}
//生成随机数
export function rand(min, max) {
  min = min * 1;
  max = max * 1;
  var num = Math.floor(Math.random() * (max - min)) + min + '';
  if (num.length != 4) { //不足4位数
    if (num.length == 3) {
      num = '0' + num;
    } else if (num.length == 2) {
      num = '00' + num;
    } else if (num.length == 1) {
      num = '000' + num;
    }
  }
  return num
}


//字符串中一个或者多个中文逗号，空格、英文逗号替换为一个英文逗号
export function replaceDot(obj) {
  obj = obj.replace(/[\r\n]/g, ",").replace(/\s+/ig, ",").replace(/，+/g, ",").replace(/,+/g, ",");
  return obj
}

//字符串中一个或者多个中文逗号，空格、英文逗号替换为空
export function replaceEmpty(obj) {
  obj = obj.replace(/[\r\n]/g, "").replace(/\s+/ig, "").replace(/，+/g, "").replace(/,+/g, "");
  return obj
}

// 日期格式化
export function parseTime(time, pattern) {
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
      time = parseInt(time)
    } else if (typeof time === 'string') {
      time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
    }
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

// 时间转换方法 转换为yyyy-mm-dd
export function formatDate(date) {
  var date = new Date(date)
  var YY = date.getFullYear() + '-'
  var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate())
  var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
  var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())
  return YY + MM + DD
}

/**
 * 表格时间格式化 转换为yyyy-mm-dd hh:mm:ss
 */
export function formatDateTime(cellValue) {
  if (cellValue == null || cellValue == '') return ''
  var date = new Date(cellValue)
  var year = date.getFullYear()
  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000
  } else {
    time = +time
  }
  const d = new Date(time)
  const now = Date.now()

  const diff = (now - d) / 1000

  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    )
  }
}

// 时间转换 ***月***日
export function get_date_str(date_) {
  if (!date_ || date_ == 'null') {
    return ''
  }
  var this_str = ''
  var this_arr = date_.split('-')
  if (this_arr.length == 3) {
    this_str = parseInt(this_arr[1]) + '月' + parseInt(this_arr[2]) + '日'
  } else if (this_arr.length == 2) {
    this_str = parseInt(this_arr[0]) + '月' + parseInt(this_arr[1]) + '日'
  }
  return this_str
}

// 将时间戳转换为类似新浪微博的时间的表示方法。
// 要求转换规则： 1分钟以内显示为：刚刚 1小时以内显示为：N分钟前 当天以内显示为：今天 N点N分（如：今天 22:33）
// 昨天时间显示为：昨天 N点N分（如：昨天 10:15） 当年以内显示为：N月N日 N点N分（如：02月03日 09:33）
// 今年以前显示为：N年N月N日 N点N分（如：2020年09月18日 15:59）
export function timestampFormat(timestamp) {
  function zeroize(num) {
    return (String(num).length == 1 ? '0' : '') + num
  }

  var curTimestamp = parseInt(new Date().getTime() / 1000) // 当前时间戳
  var timestampDiff = curTimestamp - timestamp // 参数时间戳与当前时间戳相差秒数

  var curDate = new Date(curTimestamp * 1000) // 当前时间日期对象
  var tmDate = new Date(timestamp * 1000) // 参数时间戳转换成的日期对象

  var Y = tmDate.getFullYear();
  var m = tmDate.getMonth() + 1;
  var d = tmDate.getDate()
  var H = tmDate.getHours();
  var i = tmDate.getMinutes();
  var s = tmDate.getSeconds()
  var newDate = new Date((curTimestamp - 86400) * 1000) // 参数中的时间戳加一天转换成的日期对象
  var oldDate = new Date((curTimestamp - 172800) * 1000) // 参数中的时间戳加2天转换成的日期对象
  if (timestampDiff < 60) { // 一分钟以内
    return '刚刚'
  } else if (timestampDiff < 3600) { // 一小时前之内
    return Math.floor(timestampDiff / 60) + '分钟前'
  } else if (curDate.getFullYear() == Y && curDate.getMonth() + 1 == m && curDate.getDate() == d) {
    return '今天' + zeroize(H) + ':' + zeroize(i)
  } else if (newDate.getFullYear() == Y && newDate.getMonth() + 1 == m && newDate.getDate() == d) {
    return '昨天' + zeroize(H) + ':' + zeroize(i)
  } else {
    if (oldDate.getFullYear() == Y && oldDate.getMonth() + 1 == m && oldDate.getDate() == d) {
      return '前天' + zeroize(H) + ':' + zeroize(i)
    } else if (curDate.getFullYear() == Y) {
      return zeroize(m) + '-' + zeroize(d) + ' ' + zeroize(H) + ':' + zeroize(i)
    } else {
      return Y + '-' + zeroize(m) + '-' + zeroize(d) + ' ' + zeroize(H) + ':' + zeroize(i)
    }
  }
}

// 获取当前时间(年月日时分秒)
export function getNowTime() {
  let dateTime
  const yy = new Date().getFullYear()
  const mm = (new Date().getMonth() + 1) < 10 ? '0' + (new Date().getMonth() + 1) :
    (new Date().getMonth() + 1)
  const dd = new Date().getDate() < 10 ? '0' + new Date().getDate() :
    new Date().getDate()
  const hh = new Date().getHours()
  const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() :
    new Date().getMinutes()
  const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() :
    new Date().getSeconds()
  dateTime = yy + '-' + mm + '-' + dd + ' ' + hh + ':' + mf + ':' + ss
  return dateTime
}
// 获取当前时间(年月日)
export function getNowDate() {
  let dateTime
  const yy = new Date().getFullYear()
  const mm = (new Date().getMonth() + 1) < 10 ? '0' + (new Date().getMonth() + 1) :
    (new Date().getMonth() + 1)
  const dd = new Date().getDate() < 10 ? '0' + new Date().getDate() :
    new Date().getDate()
  dateTime = yy + '-' + mm + '-' + dd
  return dateTime
}

// 日期加天数的方法
// dataStr日期字符串
// dayCount 要增加的天数（包括今天）
// return 增加n天后的日期字符串
export function dateAddDays(dataStr, dayCount) {
  var strdate = dataStr // 日期字符串
  dayCount = dayCount - 1 // 从今天开始算
  var isdate = new Date(strdate.replace(/-/g, '/')) // 把日期字符串转换成日期格式
  isdate = new Date((isdate / 1000 + (86400 * dayCount)) * 1000) // 日期加n天
  var pdate = isdate.getFullYear() + '-' + ((isdate.getMonth() + 1) < 10 ? '0' + (isdate.getMonth() + 1) : (isdate
    .getMonth() + 1)) + '-' + (isdate.getDate() < 10 ? ('0' + isdate.getDate()) : isdate.getDate()) // 把日期格式转换成字符串
  return pdate
}

// 表单重置
export function resetForm(refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields()
  }
}

// 展示logo
export function showLogoUrl() {
  const comLogo = JSON.parse(sessionStorage.getItem('cloud_comLogo'))
  const company_info = JSON.parse(sessionStorage.getItem('cloud_cur_company_info'))
  let logo_url
  if (comLogo !== null) {
    if (comLogo.squareTransparentLogo !== '' && comLogo.squareTransparentLogo !== '-1') {
      logo_url = comLogo.squareTransparentLogo
    } else if (comLogo.squareOpaqueLogo !== '' && comLogo.squareOpaqueLogo !== '-1') {
      logo_url = comLogo.squareOpaqueLogo
    } else {
      logo_url = company_info.companylogo
    }
  } else {
    logo_url = company_info.companylogo
  }

  return logo_url
}

// 添加日期范围
export function addDateRange(params, dateRange, propName) {
  const search = params
  search.params = typeof(search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search
    .params : {}
  dateRange = Array.isArray(dateRange) ? dateRange : []
  if (typeof(propName) === 'undefined') {
    search.params['beginTime'] = dateRange[0]
    search.params['endTime'] = dateRange[1]
  } else {
    search.params['begin' + propName] = dateRange[0]
    search.params['end' + propName] = dateRange[1]
  }
  return search
}

// 回显数据字典
export function selectDictLabel(datas, value) {
  var actions = []
  Object.keys(datas).some((key) => {
    if (datas[key].value == ('' + value)) {
      actions.push(datas[key].label)
      return true
    }
  })
  return actions.join('')
}

// 回显数据字典（字符串数组）
export function selectDictLabels(datas, value, separator) {
  if (value === undefined) {
    return ''
  }
  var actions = []
  var currentSeparator = undefined === separator ? ',' : separator
  var temp = value.split(currentSeparator)
  Object.keys(value.split(currentSeparator)).some((val) => {
    Object.keys(datas).some((key) => {
      if (datas[key].value == ('' + temp[val])) {
        actions.push(datas[key].label + currentSeparator)
      }
    })
  })
  return actions.join('').substring(0, actions.join('').length - 1)
}

// 字符串格式化(%s )
export function sprintf(str) {
  var args = arguments;
  var flag = true;
  var i = 1
  str = str.replace(/%s/g, function() {
    var arg = args[i++]
    if (typeof arg === 'undefined') {
      flag = false
      return ''
    }
    return arg
  })
  return flag ? str : ''
}

// 转换字符串，undefined,null等转化为""
export function parseStrEmpty(str) {
  if (!str || str == 'undefined' || str == 'null') {
    return ''
  }
  return str
}

// 数据合并
export function mergeRecursive(source, target) {
  for (var p in target) {
    try {
      if (target[p].constructor == Object) {
        source[p] = mergeRecursive(source[p], target[p])
      } else {
        source[p] = target[p]
      }
    } catch (e) {
      source[p] = target[p]
    }
  }
  return source
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  const config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  }

  var childrenListMap = {}
  var nodeIds = {}
  var tree = []

  for (const d of data) {
    const parentId = d[config.parentId]
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = []
    }
    nodeIds[d[config.id]] = d
    childrenListMap[parentId].push(d)
  }

  for (const d of data) {
    const parentId = d[config.parentId]
    if (nodeIds[parentId] == null) {
      tree.push(d)
    }
  }

  for (const t of tree) {
    adaptToChildrenList(t)
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]]
    }
    if (o[config.childrenList]) {
      for (const c of o[config.childrenList]) {
        adaptToChildrenList(c)
      }
    }
  }

  return tree
}

/**
 * 参数处理
 * @param {*} params  参数
 */
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName]
    var part = encodeURIComponent(propName) + '='
    if (value !== null && typeof(value) !== 'undefined') {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && typeof(value[key]) !== 'undefined') {
            const params = propName + '[' + key + ']'
            var subPart = encodeURIComponent(params) + '='
            result += subPart + encodeURIComponent(value[key]) + '&'
          }
        }
      } else {
        result += part + encodeURIComponent(value) + '&'
      }
    }
  }
  return result
}

// 验证是否为blob格式
export async function blobValidate(data) {
  try {
    const text = await data.text()
    JSON.parse(text)
    return false
  } catch (error) {
    return true
  }
}

/**
 * @param {Object} json
 * @returns {Array}
 */
export function param(json) {
  if (!json) return ''
  return cleanArray(
    Object.keys(json).map(key => {
      if (json[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
    })
  ).join('&')
}

/**
 * @param {string} type
 * @returns {Date}
 */
export function getTime(type) {
  if (type === 'start') {
    return new Date().getTime() - 3600 * 1000 * 24 * 90
  } else {
    return new Date(new Date().toDateString())
  }
}

// 首字母大小
export function titleCase(str) {
  return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
}

// 转化时分秒
export function get_duration(s) {
  if(s==0){
    return 0;
  }
  if(!s||s=='undefined'||s=='null'){
    return '';
  }
  let this_m=Math.floor(s/60);//转换为分钟
  if(this_m>60){
    let this_h=Math.floor(this_m/60);//获取小时
    let h_m=this_m%60;
    return this_h+'h'+h_m+'m';
  }else{
    return this_m+'m';
  }
}

// 下划转驼峰
export function camelCase(str) {
  return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
}

export function isNumberStr(str) {
  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
}

export function cardno_show(str) { //卡号显示
  if (str) {
    var str = str.replace(/\s/g, '').replace(/(.{5})/g, "$1 ");
    return str;
  }
}
export function get_days_between(stime, etime) { //获取两个日期之间的日期
  //初始化日期列表，数组
  var diffdate = new Array();
  var i = 0;
  //开始日期小于等于结束日期,并循环
  while (stime <= etime) {
    diffdate[i] = stime;
    //获取开始日期时间戳
    var stime_ts = new Date(stime).getTime();
    //增加一天时间戳后的日期
    var next_date = stime_ts + (24 * 60 * 60 * 1000);
    //拼接年月日，这里的月份会返回（0-11），所以要+1
    var next_dates_y = new Date(next_date).getFullYear() + '-';
    var next_dates_m = (new Date(next_date).getMonth() + 1 < 10) ? '0' + (new Date(next_date).getMonth() + 1) +
      '-' : (new Date(next_date).getMonth() + 1) + '-';
    var next_dates_d = (new Date(next_date).getDate() < 10) ? '0' + new Date(next_date).getDate() : new Date(
      next_date).getDate();
    stime = next_dates_y + next_dates_m + next_dates_d;
    //增加数组key
    i++;
  }
  return diffdate.length;
}
export function compare(property, desc) {
  return function(a, b) {
    var value1 = a[property];
    var value2 = b[property];
    if (desc == true) {
      // 升序排列
      return value1 - value2;
    } else {
      // 降序排列
      return value2 - value1;
    }
  }
}

